package client.tutorial;

import jp.fores.midori.client.RPCClient;
import jp.fores.midori.client.handler.BasicRPCHandler;
import jp.fores.midori.client.handler.RPCHandler;
import jp.fores.midori.client.serializer.JsonRPCSerializer;
import jp.fores.midori.client.serializer.RPCSerializer;
import tutorial.dto.CalcResultDto;

/**
 * RPCClientの少し複雑な使い方のサンプルクラス。<br>
 * 動作確認用のサーバー(http://midori-rpc.appspot.com/)のCalcServiceに対してRPCを行います。<br>
 */
public class ComplexRPCClientSample {
	//==========================================================
	//メソッド

	//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
	//クラスメソッド

	/**
	 * メインメソッドです。
	 *
	 * @param args コマンドライン引数
	 * @throws Exception 例外
	 */
	public static void main(String[] args) throws Exception {
		//==========================================================
		//呼び出し先のURL
		//(midoriフレームワークでは、通信方式に応じて拡張子が変わるので注意)

		String url = "http://midori-rpc.appspot.com/rpc/calcService.json";
		//String url = "http://midori-rpc.appspot.com/rpc/calcService.java";
		//String url = "http://midori-rpc.appspot.com/rpc/calcService.hessian";


		//==========================================================
		//RPCClientの準備

		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		//シリアライザ

		//RPC形式に応じたシリアライザのインスタンスを生成
		RPCSerializer serializer = new JsonRPCSerializer();
		//RPCSerializer serializer = new JavaRPCSerializer();
		//RPCSerializer serializer = new HessianRPCSerializer();


		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		//ハンドラ

		//使用するライブラリに応じたハンドラのインスタンスを生成
		RPCHandler handler = new BasicRPCHandler();
		//RPCHandler handler = new HttpClientRPCHandler();
		//RPCHandler handler = new HttpCoreRPCHandler();
		//RPCHandler handler = new HttpCoreNioRPCHandler();


		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		//RPCClient

		//シリアライザとハンドラを元にして、RPCClientのインスタンスを生成
		RPCClient rpcClient = new RPCClient(serializer, handler);

		//リクエスト送信時にgzip圧縮を行うかどうかのフラグ
		rpcClient.requestGZip = true;

		//レスポンスでgzip圧縮を受け入れるかどうかのフラグ
		rpcClient.responseGZip = true;

		//GAE用かどうかのフラグ
		rpcClient.isGAE = true;

		//接続タイムアウト時間(単位=ミリ秒)
		rpcClient.connectTimeout = 3000;

		//読み取りタイムアウト時間(単位=ミリ秒)
		rpcClient.readTimeout = 10000;

		//リクエストメソッド
		rpcClient.requestMethod = "PUT";


		//==========================================================
		//RPCの実行

		//RPCで「operation」メソッドを呼び出す
		//(戻り値の型指定を行う)
		//(64, 4は「operation」メソッドに渡す引数)
		CalcResultDto result = rpcClient.remoteCall(CalcResultDto.class, url, "operation", 64, 4);

		//結果の出力
		System.out.println("足し算=" + result.addition + ", 引き算="
				+ result.subtraction + ", かけ算=" + result.multiplication
				+ ", 割り算=" + result.division);
	}
}
